package model;

/**
 * 
 * Diese Klasse dient der Anwendung einer Regel an einem Feld-Objekt.
 * Dabei wird ermittelt um was fuer ein Feld es sich handelt um die
 * entsprechende Regel anzuwenden. Hierzu werden auch die umgebenden
 * Felder beruecksichtigt.
 * 
 */
public class Regelwerk {

	
	/*
	 * Uebermitteltes aktuelles Feld als Typ Feld
	 */
	private Feld aktFeld;
	
	
	/**
	 * Konstruktor der Klasse Regelwerk
	 * @param f - Uebergabe eines Felds mit dem Typ Feld
	 */
	public Regelwerk(Feld f){
		this.aktFeld = f;
	}
	
	
	/**
	 * 
	 * Anwendung der speziellen Regeln bei einem Hasen-Feld
	 * 
	 * @param oben - Oberes Nachbarfeld vom aktuellen Feld
	 * @param unten - Unteres Nachbarfeld vom aktuellen Feld
	 * @param links - Linkes Nachbarfeld vom aktuellen Feld
	 * @param rechts - Rechts Nachbarfeld vom aktuellen Feld
	 */
	private void hasenFeld(Feld oben, Feld unten, Feld links, Feld rechts){
		int hasenAnzahl = 0;
		if(oben.getTyp() == "H" ){
			hasenAnzahl++;
		}		
		if(unten.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(links.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(rechts.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(hasenAnzahl > 2){
			this.aktFeld.setTyp("G");
		}
		//Fuchs
		int fuchsAnzahl = 0;
		if(oben.getTyp() == "F" ){
			fuchsAnzahl++;
		}		
		if(unten.getTyp() == "F" ){
			fuchsAnzahl++;
		}
		if(links.getTyp() == "F" ){
			fuchsAnzahl++;
		}
		if(rechts.getTyp() == "F" ){
			fuchsAnzahl++;
		}
		if(hasenAnzahl >= 1){
			this.aktFeld.setTyp("F");
		}
	}
	
	
	/**
	 * Anwendung der speziellen Regeln bei einem Fuchs-Feld
	 * 
	 * @param oben - Oberes Nachbarfeld vom aktuellen Feld
	 * @param unten - Unteres Nachbarfeld vom aktuellen Feld
	 * @param links - Linkes Nachbarfeld vom aktuellen Feld
	 * @param rechts - Rechts Nachbarfeld vom aktuellen Feld
	 */
	private void fuchsFeld(Feld oben, Feld unten, Feld links, Feld rechts){
		int hasenAnzahl = 0;
		if(oben.getTyp() == "H" ){
			hasenAnzahl++;
		}		
		if(unten.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(links.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(rechts.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(hasenAnzahl <= 1){
			this.aktFeld.setTyp(" ");
		}
	}
	
	/**
	 * Anwendung der speziellen Regeln bei einem Grass-Feld
	 * 
	 * @param oben - Oberes Nachbarfeld vom aktuellen Feld
	 * @param unten - Unteres Nachbarfeld vom aktuellen Feld
	 * @param links - Linkes Nachbarfeld vom aktuellen Feld
	 * @param rechts - Rechts Nachbarfeld vom aktuellen Feld
	 */
	private void grassFeld(Feld oben, Feld unten, Feld links, Feld rechts){
		int hasenAnzahl = 0;
		if(oben.getTyp() == "H" ){
			hasenAnzahl++;
		}		
		if(unten.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(links.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(rechts.getTyp() == "H" ){
			hasenAnzahl++;
		}
		if(hasenAnzahl >= 1){
			this.aktFeld.setTyp("H");
		}
	}
	
	/**
	 * Anwendung der Regel bei einem leerem-Feld
	 * 
	 * @return aktuelles Feld
	 */
	public Feld leeresFeld(){	
		if(this.aktFeld.getTyp() == ""){
			this.aktFeld.setTyp("G");
		}
		return this.aktFeld;
	}
	

	
	
	
	/**
	 * Diese Methode erhaelt als einer der Parameter ein Brett, welches
	 * komplett Feld fuer Feld untersucht wird, um die entsprechenden Regeln
	 * anzuwenden.
	 * 
	 * @param brett - Das Brett
	 * @param max - Anzahl an Feldern in einer Reihe
	 * @return aktuelles Feld
	 */
	public Feld regelAnwenden(Feld[][] brett, int max){
		int x = this.aktFeld.getxKoord()-1;
		int y = this.aktFeld.getyKoord()-1;
		
		//OBEN
	//	System.out.println(y + " " + x); //zeigt an in welchem Feld man sich befindet
		Feld oben = new Feld();
		if( y-1 >= 0 ){
			oben = brett[y-1][x];
		}else{
			oben.setTyp("");
		}
		
		//UNTEN
		Feld unten = new Feld();
		if( y+1 < max ){
			unten = brett[y+1][x];
		}else{
			unten.setTyp("");
		}
		
		//LINKS
		Feld links = new Feld();
		if( x-1 >= 0 ){
			links = brett[y][x-1];
		}else{
			links.setTyp("");
		}
		
		//RECHTS
		Feld rechts = new Feld();
		if( x+1 < max ){
			rechts = brett[y][x+1];
		}else{
			rechts.setTyp("");
		}
		
		
		if( this.aktFeld.getTyp() == "H" ){
			this.hasenFeld(oben, unten, links, rechts);
		}else if( this.aktFeld.getTyp() == "F" ){
			this.fuchsFeld(oben, unten, links, rechts);
		}else if(this.aktFeld.getTyp() == "G"){
			this.grassFeld(oben, unten, links, rechts);
		}
		return this.aktFeld;
	}
	
}
